Lemon's blog

XCTF(攻防世界)—新手web题Write Up

Record my learning process of CTF.

字数统计: 1.4k阅读时长: 5 min
2019/07/10 Share

前言:之前一直没有接触过web这方面的题,这次利用暑假时光好好学习,web真的是很有趣,虽然有的题很简单,但可以学习到很多知识,话不多说,做题。

view_source

在这里插入图片描述
用老版火狐浏览器,直接查看源码即可。
在这里插入图片描述

get_post

在这里插入图片描述
在这里插入图片描述
利用火狐进行传参,即可得出flag。

robots

在这里插入图片描述

做这道题之前,了解一下robots协议,爬虫协议,robots.txt搜索引擎中访问网站的时候要查看的第一个文件,如果有这个文件,robots.txt文件告诉蜘蛛程序在服务器上什么文件是可以被查看的。

了解robots协议后,做题就好做了,直接访问robots.txt文件。
在这里插入图片描述
给了一个PHP文件名,访问一下即可得出flag
在这里插入图片描述

backup

在这里插入图片描述
在这里插入图片描述
不知道,百度百科一下
在这里插入图片描述
那加上后缀名即http://111.198.29.45:47771/index.php.bak再访问一下,即可得出flag。

在这里插入图片描述
用burp抓一下包看看在这里插入图片描述
添加后缀名在这里插入图片描述
查看HTTP响应,即可得出flag
在这里插入图片描述

disabled_button

在这里插入图片描述
在这里插入图片描述
根据提示,将disabled删除即可点出flag

webshell

在这里插入图片描述
在这里插入图片描述
一句话,用菜刀进行连接
在这里插入图片描述
连接成功,即可得出flag
在这里插入图片描述

simple_php

在这里插入图片描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
show_source(__FILE__);
include("config.php");
$a=@$_GET['a'];
$b=@$_GET['b'];
if($a==0 and $a){
echo $flag1;
}
if(is_numeric($b)){
exit();
}
if($b>1234){
echo $flag2;
}
?>

is_numeric() 函数用于检测变量是否为数字或数字字符串。

代码很好理解,传入对应的参数即可得出flag

1
http://111.198.29.45:52319/?a=a

即可得出在这里插入图片描述

1
http://111.198.29.45:52319/?b=1236b

即可得出在这里插入图片描述
拼接一下,即可得出flag

command_execution(命令执行)

在这里插入图片描述
做题之前,要先了解一下ping功能,waf等。
ping命令的使用方法及功能

WAF主要防护的是来自对网站源站的动态数据攻击,可防护的攻击类型包括SQL注入、XSS攻击、CSRF攻击、恶意爬虫、扫描器、远程文件包含等攻击,相当于防火墙。

命令执行详解

常见的命令执行

command1 & command2 :先执行command2后执行command1
command1 && command2 :先执行command1后执行command2
command1 | command2 :只执行command2
command1 || command2 :command1执行失败,再执行command2(若command1执行成功,就不再执行command2)

除此之外,我们还要了解一些常用的Linux命令。常用 Linux 命令

了解之后,我们便开始做题。
首先ping一下本地即127.0.0.1
在这里插入图片描述
ping通本地后,发现传输三个数据包,接下来就用到我们学到的Linux基本命令
查看一下,三个数据包中是否有flag.txt
输入命令127.0.0.1 & find / -name flag.txt
在这里插入图片描述
果然有,再输入命令127.0.0.1 | cat /home/flag.txt查看flag.txt文件,即可得出flag。
这里得了解一下cat命令,用来查看文件内容
在这里插入图片描述
在这里插入图片描述

weak_auth( 弱身份验证 )

在这里插入图片描述
在这里插入图片描述
试试最常用的admin 123456组合,竟然爆出了flag,真的是弱口令,不过查了其他方法,用爆破的方法也可以做出了,这里记录一下爆破过程。

先在GitHub上下载弱口令字典,用burpsuite进行爆破
在这里插入图片描述
用admin作为账号,试试登陆在这里插入图片描述
看来账号就是admin,那么就只爆破密码就可以了
密码随便输入一个,抓一下包
在这里插入图片描述
在这里插入图片描述
将密码设置为变量
载入字典
在这里插入图片描述
在这里插入图片描述
发现到123456时,长度不同,所以密码即为123456,登陆一下即可得出flag

xff_referer

在这里插入图片描述
在此之前,我们需要了解下

xff——伪造IP地址来源
格式为:
X-Forwarded-For: client1, proxy1, proxy2, proxy3
referer——伪造来源浏览器

伪造XFF头绕过服务器IP过滤
了解之后,便能够做题了
在这里插入图片描述
抓包,根据提示修改xff
在这里插入图片描述
此时页面显示必须来自https://www.google.com
根据提示,伪造来源服务器,即可得出flag
在这里插入图片描述

simple_js

在这里插入图片描述
打开之后,直接查看源代码,发现一串JS代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function dechiffre(pass_enc){
var pass = "70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65";
var tab = pass_enc.split(',');
var tab2 = pass.split(',');var i,j,k,l=0,m,n,o,p = "";i = 0;j = tab.length;
k = j + (l) + (n=0);
n = tab2.length;
for(i = (o=0); i < (k = j = n); i++ ){o = tab[i-l];p += String.fromCharCode((o = tab2[i]));
if(i == 5)break;}
for(i = (o=0); i < (k = j = n); i++ ){
o = tab[i-l];
if(i > 5 && i < k-1)
p += String.fromCharCode((o = tab2[i]));
}
p += String.fromCharCode(tab2[17]);
pass = p;return pass;
}
String["fromCharCode"](dechiffre("\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30"));

h = window.prompt('Enter password');
alert( dechiffre(h) );

要做这道题就得看懂JS代码表达的意思,首先来了解代码中出现的一些方法

split() 方法用于把一个字符串分割成字符串数组。
fromCharCode() 可接受一个指定的 Unicode 值,然后返回一个字符串。
prompt()方法用于显示可提示用户进行输入的对话框。

在这里插入图片描述

了解之后,便可以观察代码了在这里插入图片描述
这一部分代码分为两个循环,但是仔细观察的话,第一个循环是将前五个Unicode 值,然后返回一个字符串,写一个简单的python脚本验证下
在这里插入图片描述
后一个循环功能是一样的,只不过是把后面的Unicode 值,返回成字符串。
在这里插入图片描述
返回的pass为在这里插入图片描述
即不管我们输入什么,最终显示都是这个,所以这个是假的密码,那么真正的密码应该就是
在这里插入图片描述
十六进制转化为文本字符
在这里插入图片描述
再用简单的python脚本跑一下,即可得出flag
在这里插入图片描述

题虽然不是太难,但是可以学习到很多知识,接下来得快点学习python以写脚本用,方便做题。

CATALOG
  1. 1. view_source
  2. 2. get_post
  3. 3. robots
  4. 4. backup
  5. 5. cookie
  6. 6. disabled_button
  7. 7. webshell
  8. 8. simple_php
  9. 9. command_execution(命令执行)
  10. 10. weak_auth( 弱身份验证 )
  11. 11. xff_referer
  12. 12. simple_js